﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class Lote
    {
        public long LoteId { get; set; }
        public string CodigoLote { get; set; }
        public decimal Valor { get; set; }
        public int FornecedorId { get; set; }
        public int QtdItens { get; set; }
        public DateTime DataEntrega { get; set; }
        public DateTime DataValidade { get; set; }
        public DateTime DataCadastro { get; private set; }
        public bool IsNew { get { return this.LoteId == 0; } }
        public RzCorportativo.DataAccess.Lote model;

        public bool Salvar()
        {
            bool @result = false;
            Transaction.Begin((entity) =>
            {
                if (this.IsNew)
                {
                    this.DataCadastro = DateTime.Now;
                    this.model = this.Insert(entity);
                }
                else
                    this.model = this.Update(entity);
                return true;
            }).OnError((ex) =>
            {
                if (ex.InnerException != null && (ex.InnerException.Message ?? string.Empty).Contains("Violação da restrição UNIQUE KEY 'IX_Fornecedor'"))
                    throw new Exception("Lote já cadastrado");
                throw ex;
                @result = false;
            }).OnSuccess(() =>
            {
                @result = true;
                this.FornecedorId = this.model.FornecedorId;
            });
            return @result;
        }

        private RzCorportativo.DataAccess.Lote Insert(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            entity.AddToLote(@item);
            return @item;
        }

        private RzCorportativo.DataAccess.Lote Update(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            return @item;
        }

        private RzCorportativo.DataAccess.Lote CreateModel(RZCorporativoEntities entity)
        {
            var lote = new RzCorportativo.DataAccess.Lote();
            if (!this.IsNew)
            {
                lote = entity.Lote.Where(w => w.LoteId == this.LoteId).FirstOrDefault();
                if (lote == null)
                    throw new Exception("Código inválido");
            }

            lote.FornecedorId = this.FornecedorId;
            lote.LoteId = this.LoteId;
            lote.CodigoLote = this.CodigoLote;
            lote.DataCadastro = this.DataCadastro;
            lote.DataEntrega = this.DataEntrega;
            lote.DataValidade = this.DataValidade;
            lote.QtdItens = this.QtdItens;
            lote.Valor = this.Valor;
            return lote;
        }

        internal Lote CreateLote(RzCorportativo.DataAccess.Lote item)
        {
            Lote lote = new Lote();
            lote.FornecedorId = item.FornecedorId;
            lote.LoteId = item.LoteId;
            lote.CodigoLote = item.CodigoLote;
            lote.DataCadastro = item.DataCadastro;
            lote.DataEntrega = item.DataEntrega;
            lote.DataValidade = item.DataValidade;
            lote.QtdItens = item.QtdItens;
            lote.Valor = item.Valor;
            return lote;
        }

        public static List<Lib.Lote> Listar(Lib.Lote lote)
        {
            if (lote == null)
                lote = new Lote();
            List<Lib.Lote> lotes = new List<Lib.Lote>();
            RzCorportativo.DataAccess.RZCorporativoEntities db = new RZCorporativoEntities();
            bool validaDataValidade = lote.DataValidade.Date > DateTime.MinValue;
            bool validaDataEntrega = lote.DataEntrega.Date > DateTime.MinValue;
            bool validaDataCadastro = lote.DataCadastro.Date > DateTime.MinValue;
            lotes = db.Lote.Where(w =>
                    ((lote.FornecedorId == 0) || (lote.FornecedorId == w.FornecedorId)) &&
                    ((lote.LoteId == 0) || (lote.LoteId == w.LoteId)) &&
                    ((lote.CodigoLote == null || lote.CodigoLote == "") || (w.CodigoLote.Contains(lote.CodigoLote))) &&
                    (!validaDataValidade || (lote.DataValidade.Date == w.DataValidade.Date)) &&
                    (!validaDataEntrega || (lote.DataEntrega.Date == w.DataEntrega.Date)) &&
                    (!validaDataCadastro || (lote.DataCadastro.Date == w.DataCadastro.Date))
                ).ToList().Select(s => lote.CreateLote(s)).ToList();
            return lotes;
        }
    }
}
